package savet.gui.modelos;

import java.util.List;
import java.util.Observable;
import savet.entidades.Trabalhador;
import savet.entidades.atributos.AlteracaoFuncao;
import savet.entidades.atributos.AlteracaoRemuneracao;
import savet.entidades.atributos.Dependente;
import savet.entidades.atributos.HoraExtra;
import savet.entidades.atributos.Salario;
import savet.entidades.atributos.ValeTransporte;

/**
 *
 * @author Adisson Marinho
 */
public class ModeloSalarioAtributo extends AbstractTrabalhadoresModel {

    private static final String [] colunas = {"Funcao", "Remuneracao", "Alt. Funcao",
                "Alt. Remuneracao", "Dependentes", "Vale Transporte", "Jornada Mensal (h)", "Horas extras"};

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return List.class;
            case 3:
                return List.class;
            case 4:
                return List.class;
            case 5:
                return List.class;
            case 6:
                return Integer.class;
            case 7:
                return List.class;
            default:
                return  null;
        }
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Trabalhador t = getTrabalhador(rowIndex);
        Salario s = t.getSalario();

        switch (columnIndex) {
            case 0:
                atualizaFuncao(s);
                return s.getFuncao();
            case 1:
                atualizaRemuneracao(s);
                return s.getRemuneracao();
            case 2:
                return s.getAlteracoesFuncao();
            case 3:
                return s.getAlteracoesRemuneracao();
            case 4:
                return s.getListaDependentes();
            case 5:
                return s.getListaValesTransporte();
            case 6:
                return s.getJornadaMensal();
            case 7:
                return s.getListaHorasExtras();
            default:
                return  null;
        }

    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Trabalhador t = getTrabalhador(rowIndex);
        Salario s = t.getSalario();
        if (aValue != null) {
            switch (columnIndex) {
                case 0:
                    s.setFuncao((String) aValue); break;
                case 1:
                    s.setRemuneracao(Double.parseDouble(aValue.toString())); break;
                case 2:
                    s.setAlteracoesFuncao((List<AlteracaoFuncao>) aValue); break;
                case 3:
                    s.setAlteracoesRemuneracao((List<AlteracaoRemuneracao>) aValue); break;
                case 4:
                    s.setListaDependentes((List<Dependente>) aValue); break;
                case 5:
                    s.setListaValesTransporte((List<ValeTransporte>) aValue); break;
                case 6:
                    s.setJornadaMensal((Integer) aValue); break;
                case 7:
                    s.setListaHorasExtras((List<HoraExtra>) aValue); break;
            }
        }
    }

    public void elementoAdicionado(Trabalhador trabalhador) {
        criarAtributoSalario(trabalhador);
        fireTableDataChanged();
    }

    public void elementoRemovido(Trabalhador trabalhador) {
        fireTableDataChanged();
    }

    @Override
    public void fireTableCellUpdated(int row, int column) {
        super.fireTableCellUpdated(row, column);

        Salario salario = trabalhadores.get(row).getSalario();

        if (column == 0) {
            atualizaFuncao(salario);
        } else if (column == 1) {
            atualizaRemuneracao(salario);
        }
    }

    @Override
    public void update(Observable o, Object arg) {
        super.update(o, arg);
    }

    private void criarAtributoSalario(Trabalhador trabalhador) {
        if (trabalhador.getSalario() == null) {
            Salario s = new Salario();
            trabalhador.setSalario(s);
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex != 0 && columnIndex != 1;
    }

    private void atualizaRemuneracao(Salario salario) {
        if (salario != null) {
            try {
                List<AlteracaoRemuneracao> ar = salario.getAlteracoesRemuneracao();
                AlteracaoRemuneracao alteracao = ar.get(ar.size() - 1);
                salario.setRemuneracao(alteracao.getRemuneracao());
            } catch (IndexOutOfBoundsException e) {
//                System.err.println(e.getMessage() + " | atualizaRemuneracao salario atributo");
            }
        }
    }

    private void atualizaFuncao(Salario salario) {
        if (salario != null) {
            try {
                List<AlteracaoFuncao> af = salario.getAlteracoesFuncao();
                AlteracaoFuncao alteracao = af.get(af.size() - 1);
                salario.setFuncao(alteracao.getFuncao());
            } catch (IndexOutOfBoundsException e) {
//                System.err.println(e.getMessage() + " | atualizaFuncao salario atributo");
            }
        }
    }

}
